/***************************************************
> Copyright (C) 2024 ==LX== All rights reserved.
> File Name: UserServer.h
> Author: lx
> Mail:2998218073@qq.com
> Created Time: 2024年12月04日 星期三 14时14分34秒
***************************************************/

#ifndef _USERSERVER_H_
#define _USERSERVER_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/epoll.h>
#include <pthread.h>
#include "cJSON.h"
#include <mysql/mysql.h>
#include <errno.h>

typedef struct Use
{
	char order[20];
	char name[20];
	char pwd[20];
	char new_pwd[20];
	char perm[10];
}Use;
typedef struct ClientType {
	int epfd;
	int fd;
}ClientType;

// 定义任务结构体，包含客户端套接字和相关参数等信息
typedef struct Task {
    int client_socket;
    void* arg;
} Task;

// 定义线程池结构体
typedef struct ThreadPool {
    pthread_t* threads;  // 线程数组
    Task* task_queue;  // 任务队列
    int thread_count;  // 线程数量
    int queue_size;  // 任务队列容量
    int head;  // 任务队列头指针
    int tail;  // 任务队列尾指针
    int task_count;  // 当前任务数量
    pthread_mutex_t mutex;  // 互斥锁，保护任务队列访问
    pthread_cond_t cond;  // 条件变量，用于线程间通信
} ThreadPool;

/*
函数功能：线程池初始化
参数：int thread_num 线程数量 int queue_size 任务队列容量
返回值：ThreadPool* 
*/
ThreadPool* thread_pool_init(int thread_num, int queue_size);

/*
函数功能：线程执行的函数，从任务队列获取任务并执行
参数：void *arg
返回值：void
*/
void* thread_routine(void* arg);
int thread_pool_add_task(ThreadPool* pool, int client_socket, void* arg);
void thread_pool_destroy(ThreadPool* pool);
/*
函数功能：实现接受客户端注册请求，将信息存入数据库
参数：Use use
返回值：int 类型， 成功 0 /  失败 -1
*/
int insert_data(Use use);

/*
函数功能：实现接受客户端登录请求，查询数据库信息
参数：Use use
返回值：int 类型， 成功 1 /  失败 非1整数
*/
int query_data(Use use);

/*
函数功能：给客户端发送消息
参数：int client_fd 客户端通信套接字  const char* message 消息
返回值：void
*/
void send_response(int client_fd, const char* message);

/*
函数功能：检查用户名是否存在
参数：const char* username 
返回值：int 类型， 成功 1 /  失败 非1整数
*/
int check_username_exists(const char* username);
int update_password(Use use);
int delete_user(Use use);
/*
函数功能：解析客户端发送的JSON包
参数：const char* p 接收的信息
返回值：void
*/
void parseJson(const char* p, void* arg);

/*
函数功能：接收客户端信息
参数：
返回值：void
*/

void* read_msg(void* arg);

/*
函数功能：接收信号
参数：int signum 信号类型
返回值：void
*/
void handle_signal(int signum);

/*
函数功能：连接数据库
参数：void
返回值：void
*/
int db_init();
#endif
